package Compilador;

import Compilador.Lexico.AnalisadorLexico;
import Compilador.Lexico.LexicoException;
import Compilador.Lexico.Tokens.Token;
import Compilador.Lexico.Tokens.TokensType;
import Compilador.Semantico.AnalisadorSemantico;
import Compilador.Semantico.SemanticoException;
import Compilador.Sintatico.AnalisadorSintatico;
import Compilador.Sintatico.ArvoreSintatica.ArvoreSintatica;
import Compilador.Sintatico.SintaticoException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author Rafa
 */
public class Compilador {

    private ArrayList<String> linhasEntrada;
    private ArrayList<Token> tokens;

    public Compilador(String nameFile) throws FileNotFoundException, LexicoException {
        Scanner scan = new Scanner(new File(nameFile));
        linhasEntrada = new ArrayList<String>();
        while (scan.hasNextLine()) {
            linhasEntrada.add(scan.nextLine());
        }
    }

    public void AnaliseLexica() throws LexicoException, IOException {
        AnalisadorLexico analisadorLexico = new AnalisadorLexico(linhasEntrada);
        analisadorLexico.procuraTokens();
        analisadorLexico.imprimeTokens();
        this.tokens = analisadorLexico.getTokens();
    }

    public ArvoreSintatica AnaliseSintatica() throws SintaticoException {

        AnalisadorSintatico analisadorSintatico = new AnalisadorSintatico(tokens);
        if (analisadorSintatico.parser()) {
            return analisadorSintatico.getArvoreSintatica();
        } else {
            return null;
        }
    }

    public void AnaliseSemantica(ArvoreSintatica arvoreSintatica) throws SemanticoException {
        AnalisadorSemantico analisadorSemantico = new AnalisadorSemantico(arvoreSintatica);
        analisadorSemantico.analiseSemantica();

    }
}
